package com.springboot.config;

import com.springboot.bean.Cat;
import com.springboot.bean.Dog;
import com.springboot.bean.Monster;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Scope;

/**
 * @Description:
 * @Author: 张锦波
 * @Date: 2024/8/4 14:57
 * @Version: 1.0
 */

/**
 * 1.这是第二个配置类
 * 2.@Import 代码可以看到，可以指定class的数组，可以注入指定类型的bean
 * 3.通过@Import 的方式注入bean组件，默认该组件的id是它的全类名
 * 即注入的Dog.class的组件id是com.springboot.bean.Dog
 */
@Import({Cat.class, Dog.class})
@Configuration
public class BeanConfig2 {
    @Bean
    public Monster monster02() {
        return new Monster(500, "玉兔精", "吃萝卜", 200);
    }

    @Bean
    /**
     * 1.@ConditionalOnBean(name="monster02") 表示
     * 2.当容器中存在名字/id是monster02，【只要名字/id相同即可，至于类型是否一样？不用管】
     * 就向容器中注入id为dog01这个bean
     * 3.如果不存在名字/id是monster02，就不注入id为dog01这个bean。
     * 4.还有其他的条件约束注解
     *
     * 5.@ConditionalOnMissingBean(name = "monster02") 的含义正好和上面的含义相反
     * 当容器中存在名字/id是monster02，就不注入id为dog01这个bean。
     * 反之亦然。
     *
     * 6. @ConditionalOnBean(name = "monster02") 也可以放在配置类上
     * 表示对该配置类下的所有要注入的组件都进行条件约束。
     */
    @ConditionalOnBean(name = "monster02")
//    @ConditionalOnMissingBean(name = "monster02")
    public Dog dog01() {
        return new Dog();
    }
}
